#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
干净数据库初始化脚本
创建只有表结构、没有数据的数据库，用于打包部署
"""

import sys
import os
import time
from pathlib import Path

# 添加项目根目录到Python路径
current_dir = Path(__file__).parent.parent
sys.path.insert(0, str(current_dir))

from src.core.path_manager import path_manager

def close_existing_connections():
    """尝试关闭现有的数据库连接"""
    try:
        # 重新导入数据库模块以关闭连接
        import importlib
        if 'src.models.database.database' in sys.modules:
            db_module = sys.modules['src.models.database.database']
            if hasattr(db_module, 'db_manager') and hasattr(db_module.db_manager, 'engine'):
                if db_module.db_manager.engine:
                    db_module.db_manager.engine.dispose()
                    print("✅ 已关闭现有数据库连接")
    except Exception as e:
        print(f"⚠️  关闭数据库连接时出错: {e}")

def init_clean_database():
    """初始化干净的数据库"""
    print("========================================")
    print("WMS Sample 干净数据库初始化")
    print("========================================")
    print()
    
    # 获取数据库路径
    db_path = path_manager.get_database_file()
    print(f"数据库路径: {db_path}")
    print(f"部署模式: {path_manager.deployment_mode}")
    print()
    
    # 检查是否已存在数据库
    if db_path.exists():
        print("⚠️  数据库文件已存在")
        choice = input("是否要删除现有数据库并创建新的干净数据库？(y/N): ").strip().lower()
        if choice != 'y':
            print("操作已取消")
            return
        
        # 尝试关闭现有连接
        print("正在关闭现有数据库连接...")
        close_existing_connections()
        time.sleep(1)  # 等待连接完全关闭
        
        # 删除现有数据库
        max_attempts = 3
        for attempt in range(max_attempts):
            try:
                os.remove(str(db_path))
                print("✅ 已删除现有数据库文件")
                break
            except PermissionError:
                if attempt < max_attempts - 1:
                    print(f"⚠️  数据库文件被占用，等待 2 秒后重试... (尝试 {attempt + 1}/{max_attempts})")
                    time.sleep(2)
                else:
                    print("❌ 无法删除数据库文件，请确保没有其他程序在使用数据库")
                    print("   提示：请关闭所有使用数据库的程序，然后重新运行此脚本")
                    return
            except Exception as e:
                print(f"❌ 删除数据库文件失败: {e}")
                return
    
    print("正在创建干净的数据库...")
    
    try:
        # 动态导入以避免模块缓存问题
        from src.models.database.database import DatabaseManager
        
        # 创建干净的数据库管理器（仅表结构）
        clean_db_manager = DatabaseManager(init_data="clean")
        
        print("✅ 数据库表结构创建完成")
        
        # 验证表结构
        session = clean_db_manager.get_session()
        try:
            from src.models.database.models import Plate, Position
            
            # 检查表是否存在且为空
            plate_count = session.query(Plate).count()
            position_count = session.query(Position).count()
            
            print(f"✅ plates表: 存在，数据条数: {plate_count}")
            print(f"✅ positions表: 存在，数据条数: {position_count}")
            
            # 检查任务追踪字段
            import sqlite3
            conn = sqlite3.connect(str(db_path))
            cursor = conn.cursor()
            cursor.execute("PRAGMA table_info(positions)")
            columns = [column[1] for column in cursor.fetchall()]
            conn.close()
            
            task_fields = ['task_id', 'task_type', 'operator', 'operation_time']
            has_task_fields = all(field in columns for field in task_fields)
            
            print(f"✅ 任务追踪字段: {'存在' if has_task_fields else '缺失'}")
            
            if plate_count == 0 and position_count == 0 and has_task_fields:
                print("🎉 干净数据库创建成功！")
                print("   - 包含完整的表结构")
                print("   - 包含任务追踪字段")
                print("   - 不包含任何数据")
                print("   - 适合打包部署")
            else:
                if plate_count > 0 or position_count > 0:
                    print("⚠️  数据库不是完全干净的")
                if not has_task_fields:
                    print("⚠️  缺少任务追踪字段")
                
        finally:
            session.close()
            # 关闭连接以释放文件
            clean_db_manager.engine.dispose()
            
    except Exception as e:
        print(f"❌ 创建干净数据库失败: {e}")
        import traceback
        traceback.print_exc()
        return
    
    print()
    print("========================================")
    print("数据库初始化完成")
    print("========================================")
    print()
    print("使用说明:")
    print("1. 此数据库只包含表结构，没有任何数据")
    print("2. 首次运行系统时，会自动创建默认料盘")
    print("3. 适合用于打包部署到生产环境")
    print("4. 如需测试数据，请运行 init_test_database.py")

def verify_clean_database():
    """验证数据库是否为干净状态"""
    print("验证数据库状态...")
    
    db_path = path_manager.get_database_file()
    if not db_path.exists():
        print("❌ 数据库文件不存在")
        return False
    
    try:
        # 使用新的数据库管理器实例避免连接冲突
        from src.models.database.database import DatabaseManager
        temp_db_manager = DatabaseManager(init_data=False)
        
        from src.models.database.models import Plate, Position
        
        session = temp_db_manager.get_session()
        try:
            plate_count = session.query(Plate).count()
            position_count = session.query(Position).count()
            
            print(f"plates表数据条数: {plate_count}")
            print(f"positions表数据条数: {position_count}")
            
            is_clean = (plate_count == 0 and position_count == 0)
            print(f"数据库状态: {'✅ 干净' if is_clean else '❌ 包含数据'}")
            
            return is_clean
            
        finally:
            session.close()
            temp_db_manager.engine.dispose()
            
    except Exception as e:
        print(f"❌ 验证数据库失败: {e}")
        return False

if __name__ == "__main__":
    if len(sys.argv) > 1 and sys.argv[1] == "--verify":
        verify_clean_database()
    else:
        init_clean_database() 